home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 236_01 / plcheck.c < prev    next >
Text File  |  1989-06-05  |  4KB  |  165 lines

  1. /*  LCHECK by Richard Conn
  2.  
  3. LCHECK displays to the user the nesting level number of each BEGIN/END ({/})
  4. group, thereby helping him to identify problem areas in his C programs.     It
  5. recognizes quoted material and comments and ignores { and } within these.
  6.  
  7. 08/01/84 - Fixed bug that caused program to treat an \' or \" as a "live"
  8.        quote.  (Therefore, a statement such as "#define QUOTE '\''"
  9.        would screw up the level counter in the program.  Changed version
  10.        number to 1.2A.  (Don McCrady)
  11.  
  12. 05/16/87 - Conversion from BDS C to portable C.     (William C. Colley, III)
  13. */
  14.  
  15. /*
  16.  * Portability Note:  The AZTEC C compilers handle the binary/text file
  17.  * dichotomy differently from most other compilers.  Uncomment the following
  18.  * pair of #defines if you are running AZTEC C:
  19.  */
  20.  
  21. /*
  22. #define getc(f)        agetc(f)
  23. #define putc(c,f)    aputc(c,f)
  24. */
  25.  
  26. #define VERS    "2.0"  /* Version Number */
  27.  
  28. #include <stdio.h>
  29.  
  30. #ifndef FALSE
  31. #define FALSE    0
  32. #endif
  33.  
  34. #ifndef TRUE
  35. #define TRUE    (!0)
  36. #endif
  37.  
  38. #ifndef EOF
  39. #define EOF    -1
  40. #endif
  41.  
  42. #define TWIDTH    80    /* Terminal width = 80 chars */
  43. #define YES    'Y'
  44. #define NO    'N'
  45. #define ovfl    YES    /* Line Overflow */
  46. #define noovfl    NO    /* No Line Overflow */
  47.  
  48. FILE *iobuf;
  49. int level = 0, chval, pos, nroutines = 0;
  50.  
  51. int main(argc,argv)
  52. int argc;
  53. char **argv;
  54. {
  55.     int done;
  56.     void getit(), prlevel();
  57.  
  58.     if (argc == 1) {
  59.     printf("LCHECK, Version %s\n",VERS);
  60.     printf("Format of Command Line is --\n");
  61.     printf("  LCHECK filename.typ");
  62.     return TRUE;
  63.     }
  64.     if (!(iobuf = fopen(argv[1],"r"))) {
  65.     printf("Cannot Find File %s\n",argv[1]);
  66.     return TRUE;
  67.     }
  68.     printf("LCHECK, Version %s -- File:  %s\n",VERS,argv[1]);
  69.     prlevel(NO);    /* Print level number */
  70.     do {
  71.     getit();    /* Get next char */
  72.     if (chval == '\'') do { /* If single quote, flush to end quote */
  73.         getit();
  74.         if (chval == '\\') {        /* check for \'  */
  75.             getit();
  76.             if (chval == '\'')        /* Ignore it and */
  77.             getit();        /* get next char */
  78.         }
  79.         } while (chval != '\'');
  80.     if (chval == '"') do {    /* If double quote, flush to end quote */
  81.         getit();
  82.         if (chval == '\\') {        /* check for \" */
  83.             getit();
  84.             if (chval == '"')    /* Ignore it and */
  85.             getit();        /* get next char */
  86.         }
  87.         } while (chval != '"');
  88.     if (chval == '/') {        /* Possible comment */
  89.         getit();
  90.         if (chval == '*') {        /* Yes, it is a comment */
  91.         getit();
  92.         done = FALSE;
  93.         do {
  94.             if (chval == '*') {        /* End comment? */
  95.             getit();
  96.             if (chval == '/')   /* Yes */
  97.                 done = TRUE;
  98.             }
  99.             else getit();
  100.         } while (!done);
  101.         }
  102.         }
  103.     if (chval == '{') level++;  /* BEGIN */
  104.     if (chval == '}') {        /* END */
  105.         level--;
  106.         if (level == 0) {
  107.         nroutines++;
  108.         printf("\n** Routine %d **", nroutines);
  109.         }
  110.         }
  111.     } while (chval != EOF);
  112.  
  113.     printf("\nProgram Level Check is ");
  114.     if (level == 0) printf("OK");
  115.     else printf("NOT OK");
  116.     printf("\nNumber of Routines Encountered: %d",--nroutines);
  117.     fclose(iobuf);
  118.     return level != 0;
  119. }
  120.  
  121. void getit()  /* Get and Echo Character */
  122. {
  123.     void echo(), prlevel();
  124.  
  125.     chval = getc(iobuf);
  126.     if ((pos >= TWIDTH) & (chval != '\n')) prlevel(ovfl);
  127.     if (chval != EOF) echo(chval);
  128. }
  129.  
  130. void echo(chval)  /* Echo Char with tabulation */
  131. char chval;
  132. {
  133.     void prlevel();
  134.  
  135.     switch (chval) {
  136.     case '\t' : putchar(' '); pos++;
  137.         while (pos%9 != 0) {
  138.             putchar(' ');
  139.             pos++;
  140.             }
  141.         break;
  142.     case '\b' : putchar('\b');
  143.         pos--;
  144.         break;
  145.     case '\n' : prlevel(noovfl);
  146.         break;
  147.     default  :    if (chval >= ' ') {
  148.         putchar(chval);
  149.         pos++;
  150.     }
  151.     break;
  152.     }
  153. }
  154.  
  155. void prlevel(ovfl_flag)     /* Print Level Number and Set Col Count */
  156. char ovfl_flag;
  157. {
  158.     putchar('\n');
  159.     if (level < 10) printf(" %d",level);
  160.     else printf("%d",level);
  161.     if (ovfl_flag == YES) putchar('-');
  162.     else putchar(':');
  163.     putchar(' ');  pos = 5;
  164. }
  165.